﻿using System;
using System.Drawing;

public static class ColorHelper {

    /// <summary>
    /// 임의의 16진수 색 가져오기
    /// </summary>
    /// <returns>임의의 16진수 색</returns>
    public static string GetRandomColor() {
        var random = new Random();
        int r = random.Next(50, 255);
        int g = random.Next(50, 255);
        int b = random.Next(50, 255);

        return ColorTranslator.ToHtml(Color.FromArgb(r, g, b));
    }

    /// <summary>
    /// html 16진수 색이 너무 어둡지 않은지 확인합니다.
    /// </summary>
    /// <param name="htmlColor">확인할 16진수 색</param>
    /// <returns>색의 밝기가 적당하면 true이고 그렇지 않으면 false입니다.</returns>
    public static bool IsValidColor(string htmlColor) {
        // 밝기가 적당하다는 것은 색이 유효하며
        // r+g+b 값이 150을 초과함을 의미합니다.

        try {
            Color c = ColorTranslator.FromHtml(htmlColor);
            return ((c.R + c.G + c.B) >= 150);
        } catch {
            return false;
        }
    }

    /// <summary>
    /// 테두리로 사용할 더 어두운 색을 반환합니다.
    /// </summary>
    /// <param name="hex">더 어둡게 만들 색</param>
    /// <returns>전달된 색보다 더 어두운 16진수 색</returns>
    public static string GetBorderFromHtml(string hex) {

        // 잘못된 16진수 값에 대해 예외를 throw하고자
        // 합니다. 이 작업은 안전을 위해 개발자만
        // 사용해야 합니다.

        Color color = ColorTranslator.FromHtml(hex);

        // HSV를 HSL로 변환한 다음 V/L을 낮추어야 합니다.
        // 이러한 메서드는 .net에 없습니다.
        // 대신 각 R,G 및 B 값을 낮추려고 합니다.

        int newR = (int)(color.R * .5);
        int newG = (int)(color.G * .5);
        int newB = (int)(color.B * .5);

        Color darker = Color.FromArgb(newR, newG, newB);
        return ColorTranslator.ToHtml(darker);
    }
}